#!/bin/bash
# Spring Boot 应用服务脚本
# 用法: ./service.sh [start|stop|restart|status]

# 配置区域 - 根据实际项目修改
APP_NAME="rocsun"                  # 应用名称
JAR_FILE="./target/${APP_NAME}.jar"      # JAR包路径
LOG_DIR="./logs"                         # 日志目录
MAX_HEAP="1024m"                         # 最大堆内存
MIN_HEAP="512m"                          # 最小堆内存
PROFILE="prod"                           # 激活的Spring配置文件
JAVA_OPTS="-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"  # 额外JVM参数

# 内部变量
PID_FILE="${LOG_DIR}/${APP_NAME}.pid"
LOG_FILE="${LOG_DIR}/${APP_NAME}.log"

# 检查应用是否正在运行
is_running() {
    if [ -f "$PID_FILE" ]; then
        local pid=$(cat "$PID_FILE")
        if ps -p "$pid" > /dev/null 2>&1; then
            return 0  # 运行中
        else
            rm -f "$PID_FILE"  # 清理无效PID文件
        fi
    fi
    return 1  # 未运行
}

# 启动应用
start() {
    if is_running; then
        echo "[$APP_NAME] 已经在运行中，PID: $(cat $PID_FILE)"
        return 0
    fi

    # 检查JAR文件是否存在
    if [ ! -f "$JAR_FILE" ]; then
        echo "错误: JAR文件不存在 - $JAR_FILE"
        exit 1
    fi

    # 创建日志目录
    mkdir -p "$LOG_DIR"

    # 构建启动命令
    local start_cmd="java -Xms${MIN_HEAP} -Xmx${MAX_HEAP} ${JAVA_OPTS} \
        -jar ${JAR_FILE} \
        --spring.profiles.active=${PROFILE} \
        > ${LOG_FILE} 2>&1 &"

    # 执行启动命令
    echo "正在启动 [$APP_NAME]..."
    eval $start_cmd
    local pid=$!

    # 验证启动结果
    sleep 3
    if ps -p "$pid" > /dev/null 2>&1; then
        echo "$pid" > "$PID_FILE"
        echo "[$APP_NAME] 启动成功，PID: $pid"
        echo "日志文件: $LOG_FILE"
    else
        echo "[$APP_NAME] 启动失败，请查看日志: $LOG_FILE"
        exit 1
    fi
}

# 停止应用
stop() {
    if ! is_running; then
        echo "[$APP_NAME] 没有在运行"
        return 0
    fi

    local pid=$(cat "$PID_FILE")
    echo "正在停止 [$APP_NAME] (PID: $pid)..."

    # 尝试优雅停止
    kill "$pid"

    # 等待停止完成
    local count=0
    while is_running; do
        count=$((count + 1))
        if [ $count -gt 10 ]; then
            echo "强制终止 [$APP_NAME]..."
            kill -9 "$pid"
            break
        fi
        sleep 1
    done

    rm -f "$PID_FILE"
    echo "[$APP_NAME] 已停止"
}

# 重启应用
restart() {
    echo "正在重启 [$APP_NAME]..."
    stop
    start
}

# 查看应用状态
status() {
    if is_running; then
        echo "[$APP_NAME] 运行中，PID: $(cat $PID_FILE)"
        echo "内存使用: $(ps -p $(cat $PID_FILE) -o %mem,rss,vsize --no-headers)"
    else
        echo "[$APP_NAME] 未运行"
    fi
}

# 显示帮助信息
usage() {
    echo "用法: $0 [命令]"
    echo "命令列表:"
    echo "  start    启动应用"
    echo "  stop     停止应用"
    echo "  restart  重启应用"
    echo "  status   查看应用状态"
    echo "  help     显示帮助信息"
}

# 主逻辑
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    help)
        usage
        ;;
    *)
        echo "未知命令: $1"
        usage
        exit 1
        ;;
esac
